home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 September / Macworld (1998-09).dmg / Shareware World / Info / For Developers / MacZoop 1.8.3 / Required Classes / Z Headers / ZWindowManager.h < prev   
Text File  |  1998-07-09  |  6KB  |  186 lines

  1. /*************************************************************************************************
  2. *
  3. *
  4. *            MacZoop - "the framework for the rest of us"             
  5. *
  6. *
  7. *
  8. *            ZWindowManager.h        -- desktop class; handles floaters
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *            © 1996, Graham Cox
  15. *
  16. *
  17. *
  18. *
  19. *************************************************************************************************/
  20.  
  21. #pragma once
  22.  
  23. #ifndef __ZWINDOWMANAGER__
  24. #define __ZWINDOWMANAGER__
  25.  
  26. #include    "ZComrade.h"
  27.  
  28. #ifndef __ZOBJECTARRAY__
  29. #include    "ZObjectArray.h"
  30. #endif
  31.  
  32. class    ZWindow;
  33. class    ZResourceFile;
  34.  
  35. // container class definition for window list
  36.  
  37. typedef ZObjectArray<ZWindow>    ZWindowList;
  38.  
  39. // structure of 'Wpos' resource:
  40.  
  41. #if PRAGMA_ALIGN_SUPPORTED
  42. #pragma options align=mac68k
  43. #endif
  44.  
  45. typedef struct
  46. {
  47.     short    globalH;
  48.     short    globalV;
  49.     short    width;
  50.     short    height;
  51.     long    userRef;
  52.     long    reserved;
  53. }
  54. WPosResource, *WPosPtr, **WPosHdl;
  55.  
  56. #define    kWindowPosResType        'Wpos'
  57.  
  58. // note that you supply the ID for the resource, unless its 0, in which case the window template
  59. // (or dialog template) ID is used.
  60.  
  61.  
  62. #if PRAGMA_ALIGN_SUPPORTED
  63. #pragma options align=reset
  64. #endif
  65.  
  66.  
  67. // window manager class:
  68.  
  69. class    ZWindowManager    : public ZComrade
  70. {
  71.     friend class ZMenuBar;
  72.     
  73. protected:
  74.     
  75.     ZWindowList*    nonFloaters;        // list of non-floating windows
  76.     ZWindowList*    floaters;            // list of floating windows        
  77.     ZWindowList*    wmWindows;            // list of windows in menu
  78.     MenuHandle        wmMenu;                // handle of "Windows" menu if any
  79.     short            wmItemOffset;        // item count of initial number of items in menu
  80.     Point            globalPlaceLoc;        // placement position
  81.     Rect            fStoredZoom;        // stored zoom for DeactivateForDialog
  82.     Rect            fStoredZoomSource;    // ditto but source rect
  83.     Boolean            wmActive;            // tracks active state of entire window manager
  84.  
  85. public:
  86.  
  87.     ZWindowManager();
  88.     virtual    ~ZWindowManager();
  89.     
  90.     virtual void        AddWindow( ZWindow* aWindow );
  91.     virtual void        RemoveWindow( ZWindow* aWindow );
  92.     
  93.     virtual void        HideWindow( ZWindow* aWindow );
  94.     virtual void        ShowWindow( ZWindow* aWindow );
  95.     
  96.     virtual void        SelectWindow( ZWindow* aWindow );
  97.     virtual void        DragWindowOutline( ZWindow* aWindow, Point startPt, const short modifiers );
  98.  
  99.     virtual void        Suspend();
  100.     virtual void        Resume();
  101.     virtual void        Deactivate();
  102.     virtual void        DeactivateForDialog( short dlogID, Boolean isAlert = FALSE );
  103.     virtual void        Activate();
  104.     
  105.     virtual ZWindow*    GetTopWindow();
  106.     virtual ZWindow*    GetTopFloater();
  107.     virtual ZWindow*    GetBottomFloater();
  108.     
  109.     virtual Boolean        CheckDialogEvent( EventRecord* theEvent );
  110.     virtual ZWindow*    LocateWindow( const Point globalMouse );
  111.     virtual ZWindow*    GetNthWindow( const long n );
  112.     virtual ZWindow*    GetNthFloater( const long n );
  113.     virtual Boolean        IsDialog( ZWindow* aWindow );
  114.     
  115.     virtual Boolean        GetUniqueUntitledName( Str255 wName );
  116.     virtual void        FloatIdle();
  117.     
  118.     virtual short        CountWindows();
  119.     virtual short        CountFloaters();
  120.     
  121.     virtual void        InitiallyPlace( ZWindow* aWindow );
  122.     virtual void        ZoomWindowClosed( ZWindow* aWindow );
  123.  
  124. // saving/restoring window positions- use ZWindow methods for easier use (these are lowest level)
  125.     
  126.     virtual short        SaveWindowPosition( ZWindow* aWindow, ZResourceFile* aFile = NULL, short id = 0 );
  127.     virtual void        RestoreWindowPosition( ZWindow* aWindow, ZResourceFile* aFile = NULL, short id = 0 );
  128.     
  129. private:
  130.     void                BringBehind( ZWindow* aWindow, ZWindow* behindWindow );
  131.     void                PostActivation( ZWindow* aWindow, Boolean state );    
  132.     void                CalcWindowRgns( ZWindow* aWindow, RgnHandle aRgn );
  133.     void                ShowHideFloater( ZWindow* aFloater, Boolean hide );
  134.     Boolean                WindowOnDesktop( Rect* wFrame );
  135.     
  136. protected:    // these methods accessible to gMenuBar, but not user's code.
  137.  
  138.     virtual void        SetWindowsMenu( MenuHandle aMenu );
  139.     virtual void        SelectWindowFromMenu( const short itemID );
  140.     virtual void        BuildWindowsMenu();
  141.     
  142.     virtual Boolean        CommandClickInFrontDragBar( ZWindow* target, const Point startPt );
  143. };
  144.  
  145. // This object is created by the application and installed as the global gWindowManager.
  146. // Windows ask this object to manage their selection, etc instead of calling the Mac's
  147. // window manager directly. This allows us to have floaters in our app. Windows have a
  148. // "isFloater" flag, which is inited automatically by detecting which WDEF is used, though this
  149. // can be forced as needed. The event handler also calls this to manage certain window chores
  150. // like dragging, to make sure the Mac Window Manager is never given the chance to screw things
  151. // up for us.
  152.  
  153. extern    ZWindowManager*        gWindowManager;
  154.  
  155. // WARNING: You must not call high-level mac window-manager calls from your code within MacZoop.
  156. // Calls such as SelectWindow() and DragWindow() in particular will cause problems. FrontWindow()
  157. // must be used with caution, since it does not distinguish between floating and non-floating
  158. // windows. Methods are provided here and in ZApplication that provide the equivalent floater-
  159. // savvy functionality.
  160.  
  161. // New in version 1.8.3 (July 1998). ZWindowManger is now a subclass of ZComrade. Why? This allows
  162. // an object to get notified by activities involving other windows from a central source. This makes
  163. // implementing things like inspector windows much easier- become a listener of gWindowManager to
  164. // discover when other windows are activated, shown, hidden, created and destroyed. Doing this by
  165. // other means is possible, but generally more involved.
  166.  
  167. // messages: In all cases, parameter passed is the window in question, except mac dialog messages
  168. // which pass no parameter (NULL).
  169.  
  170. enum
  171. {
  172.     kWMMsgWindowAdded            = 'wm++',
  173.     kWMMsgWindowRemoved            = 'wm--',
  174.     kWMMsgWindowActivated        = 'wmak',
  175.     kWMMsgWindowDeactivated     = 'wmdk',
  176.     kWMMsgWindowShown            = 'wmv+',
  177.     kWMMsgWindowHidden            = 'wmv-',
  178.     kWMMsgWindowMoved            = 'wmmv',
  179.     kWMMsgMacDialogUp            = 'wmd+',
  180.     kWMMsgMacDialogDown            = 'wmd-',
  181.     kWMMsgFloaterActivated        = 'wmfa',
  182.     kWMMsgFloaterDeactivated    = 'wmfd'
  183. };
  184.  
  185.  
  186. #endif